﻿package org.neatmvc.core{
	
	import flash.events.EventDispatcher;
	import flash.utils.Dictionary;
	import flash.events.Event;
	
	import org.neatmvc.utils.ClassUtil;

	public class Model extends EventDispatcher {
	
		//////////////////////////////////////////////////
		// 持有一个或者多个模型数据的引用
		// 对外提供方法操作模型数据
		// 当模型数据发生变化时对外发送通知
		// 封装同读取和持久化模型数据的本地或者远程服务之间的交互
		/////////////////////////////////////////////////
		
		private static var modelMap:Dictionary = new Dictionary();//全局模型Model实例缓存池
		
		protected var data:Object;//存在于每个Model子类中，储存该Model所持有的数据
		
		///////////////////////
		//构造函数
		////////////////////////
		
		public function Model(data:Object=null) {
			var className:String = ClassUtil.nameOf(this);
			if ( modelMap[className] != null){
				throw new Error(className+"类只能被实例化一次！");
			}else{
				modelMap[className] = this;
			}
			
			if (data != null) {
				setData(data);
			}
			
			this.onRegister( );//执行注册时的附加操作
		}
		
		///////////////////////////////
		//静态方法
		///////////////////////////////////////
		
		//取回Model
		public static function getModel(key:String):Model{
			if ( modelMap[key] == null ) {
				throw new Error('对象" ' + key + ' "还未实例化！');
			}else{
				return modelMap[key];
			}
		}
		
		//注销Model
		public static function removeModel(key:String):Model {
			var model:Model = modelMap[key] as Model;
			if (model) {
				modelMap[key] = null;
				delete modelMap[key];
				model.onRemove();//执行注销时的附加操作
			}
			return model;
		}
		
		
		override public function dispatchEvent(e:Event):Boolean {//此方法改名来解除限制
			//trace( "e : " + e );	
			View.notifyObsviers(e);
			return true;
		}
		/////////////////////////////
		//实例方法
		////////////////////////////////////
		
		//设置数据
		public function setData( data:Object ):void {
			this.data = data;
		}
		
		//访问数据
		public function getData( ):Object {
			return this.data;
		}
		
		//注册model时附加操作
		public function onRegister( ):void {
			trace( "注册Model: " + this );
		}
		
		//注销model时附加操作
		public function onRemove( ):void {
			trace("注销Model: "+this);
		}
		
	}
}
